package studia.figlewicz.math.test;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;

import oracle.net.aso.k;

import studia.figlewicz.math.library.*;

public class TEST_WycenaPrzeplywow {
	
	public Date wygasniecie = new Date(110,0,1);
	public Double nominal = new Double(1);
	public Double cenaWykonaniaOpcji = new Double(100);
	
	
	
	
	public static void main(String[] args) {
		
		// dane dla przeplywow
		Date wygasniecie = new Date(101,5,30);
		Double nominal = new Double(1);
		Double cenaWykonaniaOpcji = new Double(100);
		
		
		
/////////////////////////////////////////////////////
		// projekcje
/////////////////////////////////////////////////////
		// zarzadca projekcji
		Date poczatekSymulacji = new Date(100,0,1);
		Date poczatekProjekcji = new Date(100,0,2);
		Date koniecProjekcji = new Date(101,11,31);
		Set<Date> datySymulacji = new HashSet<Date>();
		datySymulacji.add(poczatekProjekcji);
		datySymulacji.add(koniecProjekcji);
		datySymulacji.add(wygasniecie);
		ZarzadcaProjekcji zarzadcaProjekcji = new ZarzadcaProjekcji();
		
		// modele
		Model model1 = new ModelYieldCurve(MetodaInterpolacji.LINIOWA);
		Model model2 = new ModelYieldCurve(MetodaInterpolacji.LINIOWA);
		zarzadcaProjekcji.dodajModel(model1);
//		zarzadcaProjekcji.dodajModel(model2);
		ZmiennaObjasniajaca zmiennaObjasniajaca1 = TEST_KrzywaStopyProcentowej.ShortRate_test();
		ZmiennaObjasniajaca zmiennaObjasniajaca2 = TEST_KrzywaStopyProcentowej.IRS_test();
		ZmiennaObjasniajaca zmiennaObjasniajaca3 = new Stala(9);
		ZmiennaObjasniajaca zmiennaObjasniajaca4 = new ZmiennaLosowa(RozkladZmiennejLosowej.NORMALNY,0,1);
		ZmiennaObjasniajaca zmiennaObjasniajaca5 = new ZmiennaLosowa(RozkladZmiennejLosowej.JEDNOSTAJNY,0,1);
		ZmiennaObjasniajaca zmiennaObjasniajaca6 = zarzadcaProjekcji.getProjekcjaModelu(model1)
					.getProjekcjaZmiennejObjasnianej(ModelYieldCurve.ZMIENNA_OBJASNIANA_STOPA_PROCENTOWA);
//		zarzadcaProjekcji.getGeneratorLiczbLosowych().addZmiennaLosowa((ZmiennaLosowa)zmiennaObjasniajaca2);
//		zarzadcaProjekcji.getGeneratorLiczbLosowych().addZmiennaLosowa((ZmiennaLosowa)zmiennaObjasniajaca3);
		model1.setZmiennaObjasniajaca(ModelYieldCurve.ZMIENNA_OBJASNIAJACA_KONTRAKT,zmiennaObjasniajaca1);
		model2.setZmiennaObjasniajaca(ModelYieldCurve.ZMIENNA_OBJASNIAJACA_KONTRAKT,zmiennaObjasniajaca6);
		
		// wykonanie projekcji
		int iloscSymulacji = 2;
		
		
		zarzadcaProjekcji.wykonajProjekcjeMonteCarlo(datySymulacji, poczatekSymulacji, iloscSymulacji);
		
/////////////////////////////////////////////////////
		// wycena
/////////////////////////////////////////////////////
		
		
		// zarzadca wyceny
		ZarzadcaWyceny zarzadcaWyceny = new ZarzadcaWyceny();

		PrzeplywPieniezny opcjaCall = new PrzeplywOpcyjnyEuropejski(wygasniecie,cenaWykonaniaOpcji,TypOpcji.CALL,nominal);
		PrzeplywPieniezny opcjaPut = new PrzeplywOpcyjnyEuropejski(wygasniecie,cenaWykonaniaOpcji,TypOpcji.PUT,nominal);
		PrzeplywPieniezny platnosc1 = new PrzeplywPewny(wygasniecie,nominal);
		PrzeplywPieniezny platnosc2 = new PrzeplywPewny(wygasniecie,nominal);
		
		ZmiennaRynkowa zmiennaRynkowa1 = new ZmiennaRynkowa(model1,ModelYieldCurve.ZMIENNA_OBJASNIANA_STOPA_PROCENTOWA);
		ZmiennaRynkowa zmiennaRynkowa2 = new ZmiennaRynkowa(model2,ModelYieldCurve.ZMIENNA_OBJASNIANA_STOPA_PROCENTOWA);

		opcjaCall.setZmienneRynkowe(PrzeplywOpcyjnyEuropejski.CENA_INSTRUMENTU_PODSTAWOWEGO, zmiennaRynkowa1);
		opcjaPut.setZmienneRynkowe(PrzeplywOpcyjnyEuropejski.CENA_INSTRUMENTU_PODSTAWOWEGO, zmiennaRynkowa2);

		zarzadcaWyceny.dodajPrzeplyw(opcjaCall);
		zarzadcaWyceny.dodajPrzeplyw(opcjaPut);
		zarzadcaWyceny.dodajPrzeplyw(platnosc1);
		zarzadcaWyceny.dodajPrzeplyw(platnosc2);
		
		
		
		StatystykaWyceny ww1 = zarzadcaWyceny.wykonajWycene(opcjaCall,zarzadcaProjekcji.getMagazynWynikow(),0);
		StatystykaWyceny ww2 = zarzadcaWyceny.wykonajWycene(opcjaPut,zarzadcaProjekcji.getMagazynWynikow(),0);
		StatystykaWyceny ww3 = zarzadcaWyceny.wykonajWycene(opcjaCall,zarzadcaProjekcji.getMagazynWynikow(),0);
		

		zarzadcaWyceny.wycenaMonteCarlo(opcjaCall,zarzadcaProjekcji.getMagazynWynikow(),iloscSymulacji);
		zarzadcaWyceny.wycenaMonteCarlo(opcjaPut,zarzadcaProjekcji.getMagazynWynikow(),iloscSymulacji);

		WynikWyceny wwMC1 = opcjaCall.getWynikWyceny();
		WynikWyceny wwMC2 = opcjaPut.getWynikWyceny();

	}

	
}
